package com.mindskip.xzs.controller.admin;
//一个Spring Boot控制器类，用于处理管理员对试卷的操作请求。
//前端调用这些接口来执行试卷管理的各种操作，如分页查询试卷列表、编辑试卷、获取试卷信息以及删除试卷。
//每个方法对应一个特定的URL路径，前端通过发送HTTP请求（POST请求）来与这些接口交互。
//前端通过发送带有JSON数据的请求体（`@RequestBody`）来传递所需的参数。
//返回的数据也是JSON格式，前端通过解析响应数据来展示试卷信息或确认操作结果。
//使用`@Autowired`注解将`ExamPaperService`的实例注入到控制器中，方便调用服务层的方法。
//`pageList`: 处理分页获取试卷列表的请求。调用服务层获取试卷信息，并将数据转换为视图模型后返回给前端。
//`taskExamPageList`: 类似于`pageList`，但专门用于获取任务试卷的分页列表。
//`edit`: 处理编辑试卷的请求。验证请求数据后，调用服务层保存试卷信息，并返回更新后的试卷信息。
//`select`: 根据试卷ID获取试卷信息。调用服务层获取试卷信息并返回。
//`delete`: 根据试卷ID删除试卷。设置试卷为已删除状态并更新试卷信息。
//`@RestController("AdminExamPaperController")` 和 `@RequestMapping(value = "/api/admin/exam/paper")`: 定义控制器名称和接口基础路径。
//`@Autowired`: 注入服务类`ExamPaperService`。
//`public RestResponse<PageInfo<ExamResponseVM>> pageList(@RequestBody ExamPaperPageRequestVM model)`: 分页获取试卷列表的方法。调用`examPaperService.page(model)`获取分页数据，并将数据转换为视图模型后返回。
//`public RestResponse<PageInfo<ExamResponseVM>> taskExamPageList(@RequestBody ExamPaperPageRequestVM model)`: 分页获取任务试卷列表的方法。
//`public RestResponse<ExamPaperEditRequestVM> edit(@RequestBody @Valid ExamPaperEditRequestVM model)`: 编辑试卷的方法。保存试卷信息并返回更新后的数据。
//`public RestResponse<ExamPaperEditRequestVM> select(@PathVariable Integer id)`: 根据ID获取试卷信息的方法。
//`public RestResponse delete(@PathVariable Integer id)`: 删除试卷的方法。设置试卷为已删除状态并更新试卷信息。
//前端请求分页获取试卷列表
//请求URL: `/api/admin/exam/paper/page`
//请求体: `{"pageIndex": 1, "pageSize": 10, "name": "Sample Exam"}`
// 响应数据: `{ "code": 200, "data": { "list": [...], "total": 100 }, "message": "Success" }`
//前端请求编辑试卷
//请求URL: `/api/admin/exam/paper/edit`
//请求方法: POST
//请求体: `{"id": 1, "name": "Updated Exam", "questions": [...] }`
//响应数据: `{ "code": 200, "data": { "id": 1, "name": "Updated Exam", ... }, "message": "Success" }`
import com.mindskip.xzs.base.BaseApiController;
import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.domain.ExamPaper;
import com.mindskip.xzs.service.ExamPaperService;
import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.PageInfoHelper;
import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperPageRequestVM;
import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperEditRequestVM;
import com.mindskip.xzs.viewmodel.admin.exam.ExamResponseVM;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**ExamPaperController 控制器类，处理管理员操作试卷的请求*/
@RestController("AdminExamPaperController")
@RequestMapping(value = "/api/admin/exam/paper")
public class ExamPaperController extends BaseApiController {
    // 注入试卷服务类，用于处理与试卷相关的业务逻辑
    private final ExamPaperService examPaperService;
    //// 构造函数注入ExamPaperService实例
    @Autowired
    public ExamPaperController(ExamPaperService examPaperService) {
        this.examPaperService = examPaperService;
    }

    /**分页获取试卷列表*/
    @RequestMapping(value = "/page", method = RequestMethod.POST)
    public RestResponse<PageInfo<ExamResponseVM>> pageList(@RequestBody ExamPaperPageRequestVM model) {
        // 调用服务层方法获取分页的试卷信息
        PageInfo<ExamPaper> pageInfo = examPaperService.page(model);
        // 将分页的试卷信息转换为视图模型
        PageInfo<ExamResponseVM> page = PageInfoHelper.copyMap(pageInfo, e -> {
            // 创建视图模型实例
            ExamResponseVM vm = modelMapper.map(e, ExamResponseVM.class);
            vm.setCreateTime(DateTimeUtil.dateFormat(e.getCreateTime()));
            return vm;
        });
        // 返回包含视图模型分页信息的响应
        return RestResponse.ok(page);
    }


    /**分页获取任务试卷列表*/
    @RequestMapping(value = "/taskExamPage", method = RequestMethod.POST)
    public RestResponse<PageInfo<ExamResponseVM>> taskExamPageList(@RequestBody ExamPaperPageRequestVM model) {
        // 调用服务层方法获取分页的任务试卷信息
        PageInfo<ExamPaper> pageInfo = examPaperService.taskExamPage(model);
        // 将分页的任务试卷信息转换为视图模型
        PageInfo<ExamResponseVM> page = PageInfoHelper.copyMap(pageInfo, e -> {
            // 创建视图模型实例
            ExamResponseVM vm = modelMapper.map(e, ExamResponseVM.class);
            vm.setCreateTime(DateTimeUtil.dateFormat(e.getCreateTime()));
            return vm;
        });
        // 返回包含视图模型分页信息的响应
        return RestResponse.ok(page);
    }

    /**编辑试卷*/
    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    public RestResponse<ExamPaperEditRequestVM> edit(@RequestBody @Valid ExamPaperEditRequestVM model) {
        // 调用服务层方法保存试卷信息
        ExamPaper examPaper = examPaperService.savePaperFromVM(model, getCurrentUser());
        // 获取编辑后的试卷信息并转换为视图模型
        ExamPaperEditRequestVM newVM = examPaperService.examPaperToVM(examPaper.getId());
        // 返回包含编辑后试卷信息的响应
        return RestResponse.ok(newVM);
    }

    /**根据ID获取试卷信息*/
    @RequestMapping(value = "/select/{id}", method = RequestMethod.POST)
    public RestResponse<ExamPaperEditRequestVM> select(@PathVariable Integer id) {
        // 调用服务层方法获取试卷信息并转换为视图模型
        ExamPaperEditRequestVM vm = examPaperService.examPaperToVM(id);
        // 返回包含试卷信息的响应
        return RestResponse.ok(vm);
    }

    /**删除试卷*/
    @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)
    public RestResponse delete(@PathVariable Integer id) {
        // 调用服务层方法获取试卷信息
        ExamPaper examPaper = examPaperService.selectById(id);
        // 设置试卷为已删除状态
        examPaper.setDeleted(true);
        // 调用服务层方法更新试卷信息
        examPaperService.updateByIdFilter(examPaper);
        // 返回操作成功的响应
        return RestResponse.ok();
    }
}
